package com.itheima.d2_object;

//目标：掌握Object类的常用方法
public class Demo {
    public static void main(String[] args) {
        /**
         * 概述：是所有类的父类，任何一个类的对象(包括数组)，都可以调用Object类的方法
         *
         * 常用方法：
         *     boolean equals(Object obj)：判断当前对象是否与参数对象"相等"
         *     String toString()：返回该对象的字符串表示形式
         *     int hashCode()：返回对象在堆内存的十进制地址值
         */
        //需求：创建两个Student对象，让他们的属性值一样！判断两个对象是否相等！
        Student stu1 = new Student("张三", 23);
        Student stu2 = new Student("张三", 23);
        System.out.println("stu1的对象地址值：" + stu1);
        System.out.println("stu2的对象地址值：" + stu2);

        //思考：判断两个对象是否相等，那么相等的标准是什么？
        //标准可能有很多，通常我们程序员可以根据数据来衡量，也可以根据地址来衡量
        //Object是Student的父类，所以Object提供的equals()方法也可以使用，这个方法就是用来判断两个对象是否相等的？
        boolean result = stu1.equals(stu2);
        //通过结果发现：Object的equals方法衡量是否相等的标准是根据地址比较！
        System.out.println("stu1和stu2两对象是否相等：" + result);

        //1.未来客户要求：需要根据对象的数据值衡量两个对象是否相同！
        //解决方案：当父类功能不满足子类需求时，子类重写父类的方法！
        //结论：Object提供equals方法的目的，是为了让子类重写，去自定义衡量相等的标准！
        System.out.println("-----------------");

        //2.需求：调用stu1的toString()方法，此时Student没有toString()方法，就会去调用父类Object的
        String str = stu1.toString();
        System.out.println(str);
        //问题：看一个对象的地址值没有意义
        //解决：当父类Object的toString()不满足子类Student的需求时，子类需要重写toString()
        //子类的需求：一般我们打印对象，不希望看到地址值，希望看到的是对象数据值！
        //Object提供toString()方法的目的：为了让子类重写，去自定义打印对象的内容格式！
        System.out.println("-----------------");

        //3.需求：获取stu1对象在堆内存的十进制地址值
        int hash = stu1.hashCode();
        System.out.println(hash);
        //System.out.println(Integer.toHexString(hash));
        //hashCode()方法实际使用不多，因为我们拿地址值没有任何意义！了解即可！
    }
}
